import java.util.*;

/**
 * 测试SQL优化效果
 */
public class TestSQLOptimization {
    
    public static void main(String[] args) {
        // 模拟大量学校UUID
        List<String> schoolUUIDs = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            schoolUUIDs.add("school_" + i);
        }
        
        // 模拟大量专业名称
        List<String> majorNames = Arrays.asList(
            "计算机科学与技术",
            "软件工程",
            "电子信息工程",
            "机械工程",
            "土木工程",
            "经济学",
            "金融学",
            "会计学",
            "市场营销",
            "人力资源管理",
            "计算机类(计算机科学与技术、软件工程、网络工程)",
            "电子信息类(电子信息工程、通信工程、电子科学与技术)",
            "机械类(机械工程、机械设计制造及其自动化、车辆工程)",
            "经济学类(经济学、金融学、国际经济与贸易)",
            "管理学类(工商管理、市场营销、人力资源管理)"
        );
        
        System.out.println("=== SQL优化前后对比 ===");
        System.out.println("学校UUID数量: " + schoolUUIDs.size());
        System.out.println("专业名称数量: " + majorNames.size());
        
        // 计算优化前可能生成的SQL条件数量
        int originalConditions = calculateOriginalConditions(majorNames);
        System.out.println("优化前可能生成的LIKE条件数量: " + originalConditions);
        
        // 计算优化后的SQL条件数量
        int optimizedConditions = calculateOptimizedConditions(majorNames);
        System.out.println("优化后生成的LIKE条件数量: " + optimizedConditions);
        
        System.out.println("优化效果: 减少了 " + (originalConditions - optimizedConditions) + " 个条件");
        System.out.println("优化比例: " + String.format("%.2f%%", 
            (double)(originalConditions - optimizedConditions) / originalConditions * 100));
    }
    
    /**
     * 计算优化前可能生成的条件数量
     */
    private static int calculateOriginalConditions(List<String> majorNames) {
        int totalConditions = 0;
        
        for (String majorName : majorNames) {
            // 扩展专业名称
            List<String> expandedNames = expandMajorNamesWithBracketContent(Arrays.asList(majorName));
            
            // 每个扩展名称生成5个条件（1个SUBSTRING_INDEX + 4个括号匹配）
            totalConditions += expandedNames.size() * 5;
        }
        
        return totalConditions;
    }
    
    /**
     * 计算优化后的条件数量
     */
    private static int calculateOptimizedConditions(List<String> majorNames) {
        // 限制专业名称数量为10个
        int limitedSize = Math.min(majorNames.size(), 10);
        
        int totalConditions = 0;
        for (int i = 0; i < limitedSize; i++) {
            String majorName = majorNames.get(i);
            
            // 每个专业名称最多生成2个条件（原始名称 + 去括号名称）
            totalConditions += 2;
        }
        
        return totalConditions;
    }
    
    /**
     * 模拟扩展专业名称的逻辑
     */
    private static List<String> expandMajorNamesWithBracketContent(List<String> majorNames) {
        Set<String> expandedNames = new HashSet<>();
        
        for (String majorName : majorNames) {
            // 添加去除括号后的名称
            String cleanName = removeBrackets(majorName);
            if (cleanName != null && !cleanName.isEmpty()) {
                expandedNames.add(cleanName);
            }
            
            // 添加括号内的专业名称
            List<String> bracketNames = extractMajorNamesFromBrackets(majorName);
            expandedNames.addAll(bracketNames);
        }
        
        return new ArrayList<>(expandedNames);
    }
    
    /**
     * 去除专业名称中的括号及其内容
     */
    private static String removeBrackets(String majorName) {
        if (majorName != null && !majorName.trim().isEmpty()) {
            return majorName.replaceAll("\\([^)]*\\)", "").trim();
        }
        return majorName;
    }
    
    /**
     * 提取专业名称中括号内的所有专业名称
     */
    private static List<String> extractMajorNamesFromBrackets(String majorName) {
        List<String> result = new ArrayList<>();
        
        if (majorName == null || majorName.trim().isEmpty()) {
            return result;
        }
        
        int startIndex = majorName.indexOf('(');
        int endIndex = majorName.lastIndexOf(')');
        
        if (startIndex > 0 && endIndex > startIndex) {
            String bracketContent = majorName.substring(startIndex + 1, endIndex);
            
            // 按照中文顿号、逗号等分隔符分割
            String[] parts = bracketContent.split("[、，,]");
            
            for (String part : parts) {
                String trimmed = part.trim();
                if (!trimmed.isEmpty()) {
                    result.add(trimmed);
                }
            }
        }
        
        return result;
    }
}
